Autogenerated HTML docs for v1.8.1-rc2-5-g252f9 
diff --git a/technical/pack-protocol.html b/technical/pack-protocol.html index a980cc4..aabb2c3 100644 --- a/technical/pack-protocol.html +++ b/technical/pack-protocol.html 
@@ -2,15 +2,25 @@  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">   <head>  -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  -<meta name="generator" content="AsciiDoc 8.5.2" />  +<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />  +<meta name="generator" content="AsciiDoc 8.6.8" />   <title>Packfile transfer protocols</title>   <style type="text/css">  -/* Debug borders */  -p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {  -/*  - border: 1px solid red;  -*/  +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */  +  +/* Default font. */  +body {  + font-family: Georgia,serif;  +}  +  +/* Title font. */  +h1, h2, h3, h4, h5, h6,  +div.title, caption.title,  +thead, p.table.header,  +#toctitle,  +#author, #revnumber, #revdate, #revremark,  +#footer {  + font-family: Arial,Helvetica,sans-serif;   }     body {  @@ -35,13 +45,8 @@  color: #083194;   }    -tt {  - color: navy;  -}  -   h1, h2, h3, h4, h5, h6 {   color: #527bbd;  - font-family: sans-serif;   margin-top: 1.2em;   margin-bottom: 0.5em;   line-height: 1.3;  @@ -59,9 +64,11 @@  h3 + * {   clear: left;   }  +h5 {  + font-size: 1.0em;  +}     div.sectionbody {  - font-family: serif;   margin-left: 0;   }    @@ -77,45 +84,48 @@  ul, ol, li > p {   margin-top: 0;   }  +ul > li { color: #aaa; }  +ul > li > * { color: black; }    -pre {  +.monospaced, code, pre {  + font-family: "Courier New", Courier, monospace;  + font-size: inherit;  + color: navy;   padding: 0;   margin: 0;   }    -span#author {  +  +#author {   color: #527bbd;  - font-family: sans-serif;   font-weight: bold;   font-size: 1.1em;   }  -span#email {  +#email {   }  -span#revnumber, span#revdate, span#revremark {  - font-family: sans-serif;  +#revnumber, #revdate, #revremark {   }    -div#footer {  - font-family: sans-serif;  +#footer {   font-size: small;   border-top: 2px solid silver;   padding-top: 0.5em;   margin-top: 4.0em;   }  -div#footer-text {  +#footer-text {   float: left;   padding-bottom: 0.5em;   }  -div#footer-badges {  +#footer-badges {   float: right;   padding-bottom: 0.5em;   }    -div#preamble {  +#preamble {   margin-top: 1.5em;   margin-bottom: 1.5em;   }  -div.tableblock, div.imageblock, div.exampleblock, div.verseblock,  +div.imageblock, div.exampleblock, div.verseblock,   div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,   div.admonitionblock {   margin-top: 1.0em;  @@ -135,7 +145,6 @@  /* Block element titles. */   div.title, caption.title {   color: #527bbd;  - font-family: sans-serif;   font-weight: bold;   text-align: left;   margin-top: 1.0em;  @@ -157,13 +166,15 @@    div.sidebarblock > div.content {   background: #ffffee;  - border: 1px solid silver;  + border: 1px solid #dddddd;  + border-left: 4px solid #f0f0f0;   padding: 0.5em;   }     div.listingblock > div.content {  - border: 1px solid silver;  - background: #f4f4f4;  + border: 1px solid #dddddd;  + border-left: 5px solid #f0f0f0;  + background: #f8f8f8;   padding: 0.5em;   }    @@ -171,8 +182,8 @@  padding-left: 1.0em;   margin-left: 1.0em;   margin-right: 10%;  - border-left: 5px solid #dddddd;  - color: #777777;  + border-left: 5px solid #f0f0f0;  + color: #888;   }     div.quoteblock > div.attribution {  @@ -180,8 +191,9 @@  text-align: right;   }    -div.verseblock > div.content {  - white-space: pre;  +div.verseblock > pre.content {  + font-family: inherit;  + font-size: inherit;   }   div.verseblock > div.attribution {   padding-top: 0.75em;  @@ -254,35 +266,12 @@  margin-bottom: 0.1em;   }    -div.tableblock > table {  - border: 3px solid #527bbd;  -}  -thead, p.table.header {  - font-family: sans-serif;  - font-weight: bold;  -}   tfoot {   font-weight: bold;   }   td > div.verse {   white-space: pre;   }  -p.table {  - margin-top: 0;  -}  -/* Because the table frame attribute is overriden by CSS in most browsers. */  -div.tableblock > table[frame="void"] {  - border-style: none;  -}  -div.tableblock > table[frame="hsides"] {  - border-left-style: none;  - border-right-style: none;  -}  -div.tableblock > table[frame="vsides"] {  - border-top-style: none;  - border-bottom-style: none;  -}  -     div.hdlist {   margin-top: 0.8em;  @@ -339,25 +328,32 @@  min-width: 100px;   }    -  -@media print {  - div#footer-badges { display: none; }  +div.colist td {  + padding-right: 0.5em;  + padding-bottom: 0.3em;  + vertical-align: top;  +}  +div.colist td img {  + margin-top: 0.3em;   }    -div#toc {  +@media print {  + #footer-badges { display: none; }  +}  +  +#toc {   margin-bottom: 2.5em;   }    -div#toctitle {  +#toctitle {   color: #527bbd;  - font-family: sans-serif;   font-size: 1.1em;   font-weight: bold;   margin-top: 1.0em;   margin-bottom: 0.1em;   }    -div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {  +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {   margin-top: 0;   margin-bottom: 0;   }  @@ -373,51 +369,173 @@  margin-left: 6em;   font-size: 0.9em;   }  -/* Workarounds for IE6's broken and incomplete CSS2. */    -div.sidebar-content {  - background: #ffffee;  - border: 1px solid silver;  - padding: 0.5em;  +span.aqua { color: aqua; }  +span.black { color: black; }  +span.blue { color: blue; }  +span.fuchsia { color: fuchsia; }  +span.gray { color: gray; }  +span.green { color: green; }  +span.lime { color: lime; }  +span.maroon { color: maroon; }  +span.navy { color: navy; }  +span.olive { color: olive; }  +span.purple { color: purple; }  +span.red { color: red; }  +span.silver { color: silver; }  +span.teal { color: teal; }  +span.white { color: white; }  +span.yellow { color: yellow; }  +  +span.aqua-background { background: aqua; }  +span.black-background { background: black; }  +span.blue-background { background: blue; }  +span.fuchsia-background { background: fuchsia; }  +span.gray-background { background: gray; }  +span.green-background { background: green; }  +span.lime-background { background: lime; }  +span.maroon-background { background: maroon; }  +span.navy-background { background: navy; }  +span.olive-background { background: olive; }  +span.purple-background { background: purple; }  +span.red-background { background: red; }  +span.silver-background { background: silver; }  +span.teal-background { background: teal; }  +span.white-background { background: white; }  +span.yellow-background { background: yellow; }  +  +span.big { font-size: 2em; }  +span.small { font-size: 0.6em; }  +  +span.underline { text-decoration: underline; }  +span.overline { text-decoration: overline; }  +span.line-through { text-decoration: line-through; }  +  +div.unbreakable { page-break-inside: avoid; }  +  +  +/*  + * xhtml11 specific  + *  + * */  +  +div.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;   }  -div.sidebar-title, div.image-title {  - color: #527bbd;  - font-family: sans-serif;  +div.tableblock > table {  + border: 3px solid #527bbd;  +}  +thead, p.table.header {   font-weight: bold;  - margin-top: 0.0em;  - margin-bottom: 0.5em;  + color: #527bbd;  +}  +p.table {  + margin-top: 0;  +}  +/* Because the table frame attribute is overriden by CSS in most browsers. */  +div.tableblock > table[frame="void"] {  + border-style: none;  +}  +div.tableblock > table[frame="hsides"] {  + border-left-style: none;  + border-right-style: none;  +}  +div.tableblock > table[frame="vsides"] {  + border-top-style: none;  + border-bottom-style: none;   }    -div.listingblock div.content {  - border: 1px solid silver;  - background: #f4f4f4;  - padding: 0.5em;  +  +/*  + * html5 specific  + *  + * */  +  +table.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;  +}  +thead, p.tableblock.header {  + font-weight: bold;  + color: #527bbd;  +}  +p.tableblock {  + margin-top: 0;  +}  +table.tableblock {  + border-width: 3px;  + border-spacing: 0px;  + border-style: solid;  + border-color: #527bbd;  + border-collapse: collapse;  +}  +th.tableblock, td.tableblock {  + border-width: 1px;  + padding: 4px;  + border-style: solid;  + border-color: #527bbd;   }    -div.quoteblock-attribution {  - padding-top: 0.5em;  +table.tableblock.frame-topbot {  + border-left-style: hidden;  + border-right-style: hidden;  +}  +table.tableblock.frame-sides {  + border-top-style: hidden;  + border-bottom-style: hidden;  +}  +table.tableblock.frame-none {  + border-style: hidden;  +}  +  +th.tableblock.halign-left, td.tableblock.halign-left {  + text-align: left;  +}  +th.tableblock.halign-center, td.tableblock.halign-center {  + text-align: center;  +}  +th.tableblock.halign-right, td.tableblock.halign-right {   text-align: right;   }    -div.verseblock-content {  - white-space: pre;  +th.tableblock.valign-top, td.tableblock.valign-top {  + vertical-align: top;   }  -div.verseblock-attribution {  - padding-top: 0.75em;  - text-align: left;  +th.tableblock.valign-middle, td.tableblock.valign-middle {  + vertical-align: middle;  +}  +th.tableblock.valign-bottom, td.tableblock.valign-bottom {  + vertical-align: bottom;   }    -div.exampleblock-content {  - border-left: 3px solid #dddddd;  - padding-left: 0.5em;  +  +/*  + * manpage specific  + *  + * */  +  +body.manpage h1 {  + padding-top: 0.5em;  + padding-bottom: 0.5em;  + border-top: 2px solid silver;  + border-bottom: 2px solid silver;  +}  +body.manpage h2 {  + border-style: none;  +}  +body.manpage div.sectionbody {  + margin-left: 3em;   }    -/* IE6 sets dynamically generated links as visited. */  -div#toc a:visited { color: blue; }  +@media print {  + body.manpage div#toc { display: none; }  +}  +  +   </style>   <script type="text/javascript">   /*<![CDATA[*/  -window.onload = function(){asciidoc.footnotes();}   var asciidoc = { // Namespace.     /////////////////////////////////////////////////////////////////////  @@ -459,7 +577,7 @@    function tocEntries(el, toclevels) {   var result = new Array;  - var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');  + var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');   // Function that scans the DOM tree for header elements (the DOM2   // nodeIterator API would be a better technique but not supported by all   // browsers).  @@ -479,6 +597,25 @@  }     var toc = document.getElementById("toc");  + if (!toc) {  + return;  + }  +  + // Delete existing TOC entries in case we're reloading the TOC.  + var tocEntriesToRemove = [];  + var i;  + for (i = 0; i < toc.childNodes.length; i++) {  + var entry = toc.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div'  + && entry.getAttribute("class")  + && entry.getAttribute("class").match(/^toclevel/))  + tocEntriesToRemove.push(entry);  + }  + for (i = 0; i < tocEntriesToRemove.length; i++) {  + toc.removeChild(tocEntriesToRemove[i]);  + }  +  + // Rebuild TOC entries.   var entries = tocEntries(document.getElementById("content"), toclevels);   for (var i = 0; i < entries.length; ++i) {   var entry = entries[i];  @@ -506,24 +643,44 @@  */     footnotes: function () {  - var cont = document.getElementById("content");  + // Delete existing footnote entries in case we're reloading the footnodes.  + var i;   var noteholder = document.getElementById("footnotes");  + if (!noteholder) {  + return;  + }  + var entriesToRemove = [];  + for (i = 0; i < noteholder.childNodes.length; i++) {  + var entry = noteholder.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")  + entriesToRemove.push(entry);  + }  + for (i = 0; i < entriesToRemove.length; i++) {  + noteholder.removeChild(entriesToRemove[i]);  + }  +  + // Rebuild footnote entries.  + var cont = document.getElementById("content");   var spans = cont.getElementsByTagName("span");   var refs = {};   var n = 0;   for (i=0; i<spans.length; i++) {   if (spans[i].className == "footnote") {   n++;  - // Use [\s\S] in place of . so multi-line matches work.  - // Because JavaScript has no s (dotall) regex flag.  - note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];  + var note = spans[i].getAttribute("data-note");  + if (!note) {  + // Use [\s\S] in place of . so multi-line matches work.  + // Because JavaScript has no s (dotall) regex flag.  + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];  + spans[i].innerHTML =  + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +  + "' title='View footnote' class='footnote'>" + n + "</a>]";  + spans[i].setAttribute("data-note", note);  + }   noteholder.innerHTML +=   "<div class='footnote' id='_footnote_" + n + "'>" +   "<a href='#_footnoteref_" + n + "' title='Return to text'>" +   n + "</a>. " + note + "</div>";  - spans[i].innerHTML =  - "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +  - "' title='View footnote' class='footnote'>" + n + "</a>]";   var id =spans[i].getAttribute("id");   if (id != null) refs["#"+id] = n;   }  @@ -543,13 +700,36 @@  }   }   }  +},  +  +install: function(toclevels) {  + var timerId;  +  + function reinstall() {  + asciidoc.footnotes();  + if (toclevels) {  + asciidoc.toc(toclevels);  + }  + }  +  + function reinstallAndRemoveTimer() {  + clearInterval(timerId);  + reinstall();  + }  +  + timerId = setInterval(reinstall, 500);  + if (document.addEventListener)  + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);  + else  + window.onload = reinstallAndRemoveTimer;   }     }  +asciidoc.install();   /*]]>*/   </script>   </head>  -<body>  +<body class="article">   <div id="header">   <h1>Packfile transfer protocols</h1>   </div>  @@ -569,6 +749,7 @@  of data to send in order to fully update one or the other.</p></div>   </div>   </div>  +<div class="sect1">   <h2 id="_transports">Transports</h2>   <div class="sectionbody">   <div class="paragraph"><p>There are three transports over which the packfile protocol is  @@ -584,6 +765,8 @@  <div class="paragraph"><p>The file:// transport runs the <em>upload-pack</em> or <em>receive-pack</em>   process locally and communicates with it over a pipe.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_git_transport">Git Transport</h2>   <div class="sectionbody">   <div class="paragraph"><p>The Git transport starts off by sending the command and repository  @@ -591,15 +774,18 @@  hostname parameter, terminated by a NUL byte.</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>0032git-upload-pack /project.git\0host=myserver.com\0</tt></pre>  +<pre><code>0032git-upload-pack /project.git\0host=myserver.com\0</code></pre>   </div></div>  +<div class="openblock">  +<div class="content">   <div class="literalblock">   <div class="content">  -<pre><tt>git-proto-request = request-command SP pathname NUL [ host-parameter NUL ]  +<pre><code>git-proto-request = request-command SP pathname NUL [ host-parameter NUL ]   request-command = "git-upload-pack" / "git-receive-pack" /   "git-upload-archive" ; case sensitive   pathname = *( %x01-ff ) ; exclude NUL  -host-parameter = "host=" hostname [ ":" port ]</tt></pre>  +host-parameter = "host=" hostname [ ":" port ]</code></pre>  +</div></div>   </div></div>   <div class="paragraph"><p>Only host-parameter is allowed in the git-proto-request. Clients   MUST NOT attempt to send additional parameters. It is used for the  @@ -609,17 +795,19 @@  process on the server side over the Git protocol is this:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ echo -e -n \  +<pre><code>$ echo -e -n \   "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |  - nc -v example.com 9418</tt></pre>  + nc -v example.com 9418</code></pre>   </div></div>   <div class="paragraph"><p>If the server refuses the request for some reasons, it could abort   gracefully with an error message.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> error-line = PKT-LINE("ERR" SP explanation-text)</tt></pre>  +<pre><code> error-line = PKT-LINE("ERR" SP explanation-text)</code></pre>   </div></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_ssh_transport">SSH Transport</h2>   <div class="sectionbody">   <div class="paragraph"><p>Initiating the upload-pack or receive-pack processes over SSH is  @@ -627,7 +815,7 @@  It is basically equivalent to running this:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ ssh git.example.com "git-upload-pack '/project.git'"</tt></pre>  +<pre><code>$ ssh git.example.com "git-upload-pack '/project.git'"</code></pre>   </div></div>   <div class="paragraph"><p>For a server to support Git pushing and pulling for a given user over   SSH, that user needs to be able to execute one or both of those  @@ -640,28 +828,28 @@  an absolute path in the remote filesystem.</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt> git clone ssh://user@example.com/project.git  +<pre><code> git clone ssh://user@example.com/project.git   |   v  -ssh user@example.com "git-upload-pack '/project.git'"</tt></pre>  +ssh user@example.com "git-upload-pack '/project.git'"</code></pre>   </div></div>   <div class="paragraph"><p>In a "user@host:path" format URI, its relative to the user&#8217;s home   directory, because the Git client will run:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt> git clone user@example.com:project.git  +<pre><code> git clone user@example.com:project.git   |   v  -ssh user@example.com "git-upload-pack 'project.git'"</tt></pre>  +ssh user@example.com "git-upload-pack 'project.git'"</code></pre>   </div></div>   <div class="paragraph"><p>The exception is if a <em>~</em> is used, in which case   we execute it without the leading <em>/</em>.</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt> ssh://user@example.com/~alice/project.git,  +<pre><code> ssh://user@example.com/~alice/project.git,   |   v  -ssh user@example.com "git-upload-pack '~alice/project.git'"</tt></pre>  +ssh user@example.com "git-upload-pack '~alice/project.git'"</code></pre>   </div></div>   <div class="paragraph"><p>A few things to remember here:</p></div>   <div class="ulist"><ul>  @@ -678,6 +866,8 @@  </li>   </ul></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_fetching_data_from_a_server">Fetching Data From a Server</h2>   <div class="sectionbody">   <div class="paragraph"><p>When one Git repository wants to get data that a second repository  @@ -685,6 +875,8 @@  what data the server has that the client does not then streams that   data down to the client in packfile format.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_reference_discovery">Reference Discovery</h2>   <div class="sectionbody">   <div class="paragraph"><p>When the client initially connects the server will immediately respond  @@ -692,7 +884,7 @@  with the object name that each reference currently points to.</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |  +<pre><code>$ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |   nc -v example.com 9418   00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack   side-band side-band-64k ofs-delta shallow no-progress include-tag  @@ -701,7 +893,7 @@  003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9   003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0   003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{}  -0000</tt></pre>  +0000</code></pre>   </div></div>   <div class="paragraph"><p>Server SHOULD terminate each non-flush line using LF ("\n") terminator;   client MUST NOT complain if there is no terminator.</p></div>  @@ -717,7 +909,7 @@  MUST peel the ref if it&#8217;s an annotated tag.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> advertised-refs = (no-refs / list-of-refs)  +<pre><code> advertised-refs = (no-refs / list-of-refs)   flush-pkt     no-refs = PKT-LINE(zero-id SP "capabilities^{}"  @@ -733,13 +925,15 @@    capability-list = capability *(SP capability)   capability = 1*(LC_ALPHA / DIGIT / "-" / "_")  - LC_ALPHA = %x61-7A</tt></pre>  + LC_ALPHA = %x61-7A</code></pre>   </div></div>   <div class="paragraph"><p>Server and client MUST use lowercase for obj-id, both MUST treat obj-id   as case-insensitive.</p></div>   <div class="paragraph"><p>See protocol-capabilities.txt for a list of allowed server capabilities   and descriptions.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_packfile_negotiation">Packfile Negotiation</h2>   <div class="sectionbody">   <div class="paragraph"><p>After reference and capabilities discovery, the client can decide to  @@ -755,7 +949,7 @@  out of what the server said it could do with the first <em>want</em> line.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> upload-request = want-list  +<pre><code> upload-request = want-list   *shallow-line   *1depth-request   flush-pkt  @@ -770,7 +964,7 @@  first-want = PKT-LINE("want" SP obj-id SP capability-list LF)   additional-want = PKT-LINE("want" SP obj-id LF)    - depth = 1*DIGIT</tt></pre>  + depth = 1*DIGIT</code></pre>   </div></div>   <div class="paragraph"><p>Clients MUST send all the obj-ids it wants from the reference   discovery phase as <em>want</em> lines. Clients MUST send at least one  @@ -799,13 +993,13 @@  a positive depth, this step is skipped.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> shallow-update = *shallow-line  +<pre><code> shallow-update = *shallow-line   *unshallow-line   flush-pkt     shallow-line = PKT-LINE("shallow" SP obj-id)    - unshallow-line = PKT-LINE("unshallow" SP obj-id)</tt></pre>  + unshallow-line = PKT-LINE("unshallow" SP obj-id)</code></pre>   </div></div>   <div class="paragraph"><p>If the client has requested a positive depth, the server will compute   the set of commits which are no deeper than the desired depth. The set  @@ -824,12 +1018,12 @@  so that there is always a block of 32 "in-flight on the wire" at a time.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> upload-haves = have-list  +<pre><code> upload-haves = have-list   compute-end     have-list = *have-line   have-line = PKT-LINE("have" SP obj-id LF)  - compute-end = flush-pkt / PKT-LINE("done")</tt></pre>  + compute-end = flush-pkt / PKT-LINE("done")</code></pre>   </div></div>   <div class="paragraph"><p>If the server reads <em>have</em> lines, it then will respond by ACKing any   of the obj-ids the client said it had that the server also has. The  @@ -906,16 +1100,16 @@  <div class="paragraph"><p>Then the server will start sending its packfile data.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> server-response = *ack_multi ack / nak  +<pre><code> server-response = *ack_multi ack / nak   ack_multi = PKT-LINE("ACK" SP obj-id ack_status LF)   ack_status = "continue" / "common" / "ready"   ack = PKT-LINE("ACK SP obj-id LF)  - nak = PKT-LINE("NAK" LF)</tt></pre>  + nak = PKT-LINE("NAK" LF)</code></pre>   </div></div>   <div class="paragraph"><p>A simple clone may look like this (with no <em>have</em> lines):</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \  +<pre><code> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \   side-band-64k ofs-delta\n   C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n   C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n  @@ -925,12 +1119,12 @@  C: 0009done\n     S: 0008NAK\n  - S: [PACKFILE]</tt></pre>  + S: [PACKFILE]</code></pre>   </div></div>   <div class="paragraph"><p>An incremental update (fetch) response might look like this:</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \  +<pre><code> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \   side-band-64k ofs-delta\n   C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n   C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n  @@ -947,9 +1141,11 @@  C: 0009done\n     S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n  - S: [PACKFILE]</tt></pre>  + S: [PACKFILE]</code></pre>   </div></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_packfile_data">Packfile Data</h2>   <div class="sectionbody">   <div class="paragraph"><p>Now that the client and server have finished negotiation about what  @@ -972,6 +1168,8 @@  <div class="paragraph"><p>If no <em>side-band</em> capability was specified, the server will stream the   entire packfile without multiplexing.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_pushing_data_to_a_server">Pushing Data To a Server</h2>   <div class="sectionbody">   <div class="paragraph"><p>Pushing data to a server will invoke the <em>receive-pack</em> process on the  @@ -980,6 +1178,8 @@  references to be complete. Once all the data is received and validated,   the server will then update its references to what the client specified.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_authentication">Authentication</h2>   <div class="sectionbody">   <div class="paragraph"><p>The protocol itself contains no authentication mechanisms. That is to be  @@ -988,6 +1188,8 @@  repositories will be writable by anyone who can access that port (9418) as   that transport is unauthenticated.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_reference_discovery_2">Reference Discovery</h2>   <div class="sectionbody">   <div class="paragraph"><p>The reference discovery phase is done nearly the same way as it is in the  @@ -996,6 +1198,8 @@  real difference is that the capability listing is different - the only   possible values are <em>report-status</em>, <em>delete-refs</em> and <em>ofs-delta</em>.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_reference_update_request_and_packfile_transfer">Reference Update Request and Packfile Transfer</h2>   <div class="sectionbody">   <div class="paragraph"><p>Once the client knows what references the server is at, it can send a  @@ -1008,7 +1212,7 @@  references.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> update-request = command-list [pack-file]  +<pre><code> update-request = command-list [pack-file]     command-list = PKT-LINE(command NUL capability-list LF)   *PKT-LINE(command LF)  @@ -1022,7 +1226,7 @@  old-id = obj-id   new-id = obj-id    - pack-file = "PACK" 28*(OCTET)</tt></pre>  + pack-file = "PACK" 28*(OCTET)</code></pre>   </div></div>   <div class="paragraph"><p>If the receiving end does not support delete-refs, the sending end MUST   NOT ask for delete command.</p></div>  @@ -1038,6 +1242,8 @@  it will run any update hooks to make sure that the update is acceptable.   If all of that is fine, the server will then update the references.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_report_status">Report Status</h2>   <div class="sectionbody">   <div class="paragraph"><p>After receiving the pack data from the sender, the receiver sends a  @@ -1049,7 +1255,7 @@  update was successful, or <em>ng [refname] [error]</em> if the update was not.</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> report-status = unpack-status  +<pre><code> report-status = unpack-status   1*(command-status)   flush-pkt    @@ -1060,7 +1266,7 @@  command-ok = PKT-LINE("ok" SP refname LF)   command-fail = PKT-LINE("ng" SP refname SP error-msg LF)    - error-msg = 1*(OCTECT) ; where not "ok"</tt></pre>  + error-msg = 1*(OCTECT) ; where not "ok"</code></pre>   </div></div>   <div class="paragraph"><p>Updates can be unsuccessful for a number of reasons. The reference can have   changed since the reference discovery phase was originally sent, meaning  @@ -1071,7 +1277,7 @@  <div class="paragraph"><p>An example client/server communication might look like this:</p></div>   <div class="listingblock">   <div class="content">  -<pre><tt> S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n  +<pre><code> S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n   S: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe refs/heads/debug\n   S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/master\n   S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/team\n  @@ -1084,14 +1290,15 @@    S: 000eunpack ok\n   S: 0018ok refs/heads/debug\n  - S: 002ang refs/heads/master non-fast-forward\n</tt></pre>  + S: 002ang refs/heads/master non-fast-forward\n</code></pre>   </div></div>   </div>   </div>  +</div>   <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2012-11-20 13:06:02 PDT  +Last updated 2012-11-20 13:06:02 PST   </div>   </div>   </body>